// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_OUTPUT_COPY_OUTPUT_RESULT_H_
#define CC_OUTPUT_COPY_OUTPUT_RESULT_H_

#include <memory>

#include "base/memory/ptr_util.h"
#include "cc/base/cc_export.h"
#include "cc/resources/single_release_callback.h"
#include "cc/resources/texture_mailbox.h"
#include "ui/gfx/geometry/size.h"

class SkBitmap;

namespace cc {
class TextureMailbox;

class CC_EXPORT CopyOutputResult {
public:
    static std::unique_ptr<CopyOutputResult> CreateEmptyResult()
    {
        return base::WrapUnique(new CopyOutputResult);
    }
    static std::unique_ptr<CopyOutputResult> CreateBitmapResult(
        std::unique_ptr<SkBitmap> bitmap)
    {
        return base::WrapUnique(new CopyOutputResult(std::move(bitmap)));
    }
    static std::unique_ptr<CopyOutputResult> CreateTextureResult(
        const gfx::Size& size,
        const TextureMailbox& texture_mailbox,
        std::unique_ptr<SingleReleaseCallback> release_callback)
    {
        return base::WrapUnique(new CopyOutputResult(size, texture_mailbox,
            std::move(release_callback)));
    }

    ~CopyOutputResult();

    bool IsEmpty() const { return !HasBitmap() && !HasTexture(); }
    bool HasBitmap() const { return !!bitmap_; }
    bool HasTexture() const { return texture_mailbox_.IsValid(); }

    gfx::Size size() const { return size_; }
    std::unique_ptr<SkBitmap> TakeBitmap();
    void TakeTexture(TextureMailbox* texture_mailbox,
        std::unique_ptr<SingleReleaseCallback>* release_callback);

private:
    CopyOutputResult();
    explicit CopyOutputResult(std::unique_ptr<SkBitmap> bitmap);
    explicit CopyOutputResult(
        const gfx::Size& size,
        const TextureMailbox& texture_mailbox,
        std::unique_ptr<SingleReleaseCallback> release_callback);

    gfx::Size size_;
    std::unique_ptr<SkBitmap> bitmap_;
    TextureMailbox texture_mailbox_;
    std::unique_ptr<SingleReleaseCallback> release_callback_;
};

} // namespace cc

#endif // CC_OUTPUT_COPY_OUTPUT_RESULT_H_
